//package com.info.zhiduoduo.pay.service;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.mapper.Condition;
//import com.info.zhiduoduo.common.configs.KltPayConfig;
//import com.info.zhiduoduo.common.constants.Constants;
//import com.info.zhiduoduo.common.constants.SmartResult;
//import com.info.zhiduoduo.common.constants.StatusMsg;
//import com.info.zhiduoduo.common.constants.system.UserType;
//import com.info.zhiduoduo.common.constants.pay.PayAccount;
//import com.info.zhiduoduo.common.formbean.BaseSimpleFormBean;
//import com.info.zhiduoduo.common.utils.AesCbcUtil;
//import com.info.zhiduoduo.common.utils.DateUtil;
//import com.info.zhiduoduo.common.utils.LogUtil;
//import com.info.zhiduoduo.common.utils.StringUtil;
//import com.info.zhiduoduo.pay.configs.PayConstants;
//import com.info.zhiduoduo.pay.dto.QueryResultDto;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.constants.SignType;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.Head;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.util.HttpUtils;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.util.RSAUtils;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.util.SignUtils;
//import com.info.zhiduoduo.repository.entity.company.CompanyAccount;
//import com.info.zhiduoduo.repository.entity.order.TradeRecord;
//import com.info.zhiduoduo.repository.entity.partner.PartnerWithdraw;
//
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.StringUtils;
//
//import java.math.BigDecimal;
//import java.math.RoundingMode;
//import java.util.Arrays;
//
//import lombok.extern.slf4j.Slf4j;
//
///**
// * 开联通 支付工具
// *
// * @author bob
// * @since 2019/1/15 上午11:17
// */
//@Slf4j
//@Service
//public class KltPayService {
//
//	@Autowired
//	KltPayConfig kltPayConfig;
//
//	/**
//	 * 单笔实时代付,付款给创客
//	 *
//	 * @param formBean 交易记录
//	 * @return
//	 */
//	public SmartResult singlePay(BaseSimpleFormBean<TradeRecord> formBean) {
//
//		TradeRecord trade = formBean.getReqdata();
//
//		LogUtil.info("trade = " + trade);
//		if (trade == null) return SmartResult.ofErrorParam();
//		if (trade.getTradetype() != PayConstants.TRADE_TYPE_PAYMENT) {
//			return SmartResult.ofErrorParam();
//		}
//
//		//支付记录,检查是否已存在还未处理好的支付记录.如果有,等待支付结果即可，不需要再调用支付接口。
//		//支付创建中,处理中和处理成功,表示不需要再新建了.直接返回
//		int recordProcessing = new TradeRecord().selectCount(Condition.create()
//				.eq("projectid", trade.getProjectid())
//				.eq("idtype", UserType.MAKER)
//				.eq("business_type", trade.getBusinessType())
//				.in("tradestate", Arrays.asList(Constants.TRADE_CREATE, Constants.TRADE_IN_PROCESS)));
//		if (recordProcessing > 0) {
//			return SmartResult.fail(StatusMsg.StatusMsg_448);
//		}
//		int recordSuccess = new TradeRecord().selectCount(Condition.create()
//				.eq("projectid", trade.getProjectid())
//				.eq("idtype", UserType.MAKER)
//				.eq("business_type", trade.getBusinessType())
//				.eq("tradestate", Constants.TRADE_SUCCESS));
//		if (recordSuccess > 0) {
//			return SmartResult.fail(StatusMsg.StatusMsg_449);
//		}
//
//		String merchantid = trade.getMerchantid();
//		String key = "";
//		String signType;
//		if (trade.getPayAccount() == PayAccount.DAYS_JIUGE) {
//			//使用九歌账户支付
//			merchantid = kltPayConfig.getMerchantId();
//			key = kltPayConfig.getMd5Key();
//			signType = SignType.MD5;
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			signType = SignType.RSA;
//			try {
//				key = AesCbcUtil.decrypt(account.getMerchantPrivateKey());
//			} catch (Exception e) {
//				log.error("解析企业商户号的私钥失败", e);
//			}
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType(signType);
//
//		String bankNo = trade.getAccttype() == 2 ? trade.getBankno() : "000000000000";
//
//		PayContent content = new PayContent().setAccountName(trade.getAcctname())
//				.setAccountNo(trade.getAcctno())
//				.setAmt(trade.getTradeamount().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString())
//				.setAccountType(trade.getAccttype() + "")
//				.setBankName(trade.getBankname())
//				.setBankNo(bankNo)
//				.setMchtOrderNo(trade.getTradeno())
//				.setOrderDateTime(DateUtil.getStringDate(trade.getTradetime(), DateUtil.FORMAT_STYLE_7))
//				.setPurpose(trade.getPurpose())
//				.setNotifyUrl(kltPayConfig.getPayNotifyUrl());
//
//		return payInternal(key, head, content);
//	}
//
//	/**
//	 * 单笔实时代付,合伙人提现
//	 *
//	 * @param formBean 交易记录
//	 * @return
//	 */
//	public SmartResult singleWithdraw(BaseSimpleFormBean<PartnerWithdraw> formBean) {
//
//		PartnerWithdraw withdraw = formBean.getReqdata();
//		LogUtil.info("withdraw = " + withdraw);
//
//		String merchantid = withdraw.getMerchantid();
//		String key = "";
//		String signType;
//		if (StringUtil.isEmpty(merchantid)) {
//			//使用九歌账户支付
//			merchantid = kltPayConfig.getMerchantId();
//			key = kltPayConfig.getMd5Key();
//			signType = SignType.MD5;
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			signType = SignType.RSA;
//			try {
//				key = AesCbcUtil.decrypt(account.getMerchantPrivateKey());
//			} catch (Exception e) {
//				log.error("解析企业商户号的私钥失败", e);
//			}
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType(signType);
//		String bankNo = "000000000000";
//
//		PayContent content = new PayContent().setAccountName(withdraw.getAcctname())
//				.setAccountNo(withdraw.getAcctno())
//				.setAmt(withdraw.getAmount().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString())
//				.setAccountType("1")
//				.setBankName(withdraw.getBankname())
//				.setBankNo(bankNo)
//				.setMchtOrderNo(withdraw.getWdno())
//				.setOrderDateTime(DateUtil.getStringDate(withdraw.getCreatetime(), DateUtil.FORMAT_STYLE_7))
//				.setPurpose(withdraw.getPurpose())
//				.setNotifyUrl(kltPayConfig.getPayNotifyUrl());
//
//		return payInternal(key, head, content);
//	}
//
//	/**
//	 * @param key
//	 * @param head
//	 * @param content
//	 * @return
//	 */
//	private SmartResult payInternal(String key, Head head, PayContent content) {
//		PayRequest request = new PayRequest();
//		request.setHead(head);
//		request.setContent(content);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		LogUtil.info("支付请求参数, 签名前:" + originSign);
//		LogUtil.info("key=" + key);
//
//		String respJsonStr = null;
//		try {
//			//添加签名
//			String signStr;
//			if (head.getSignType().equals(SignType.MD5)) {
//				signStr = SignUtils.addSign(originSign, key);
//			} else {
//				signStr = RSAUtils.sortAndRsa256Sign(originSign, key);
//			}
//			LogUtil.info("签名后,请求参数:" + signStr);
//			//忽略SSL认证
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getPayUrl(), signStr, false);
//		} catch (Exception e) {
//			e.printStackTrace();
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("调用代付 返回:" + respJsonStr);
//		PayResult result = JSON.parseObject(respJsonStr, PayResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			SmartResult smartResult = SmartResult.fail(StatusMsg.StatusMsg_445);
//			smartResult.setObject(result);
//			return smartResult;
//		}
//		return SmartResult.success(result);
//	}
//
//	/**
//	 * 单笔代付 查询代付结果
//	 *
//	 * @param formBean
//	 */
//	public SmartResult querySinglePay(BaseSimpleFormBean<Integer> formBean) {
//
//		Integer tradeid = formBean.getReqdata();
//		TradeRecord trade = new TradeRecord().selectById(tradeid);
//
//		if (trade == null || trade.getTradetype() != PayConstants.TRADE_TYPE_PAYMENT) {
//			return SmartResult.ofErrorParam();
//		}
//
//		String merchantid = trade.getMerchantid();
//		String key = "";
//		String signType = "";
//		if (StringUtils.isEmpty(merchantid) && trade.getPayAccount() == PayAccount.DAYS_JIUGE) {
//			//使用九歌账户支付
//			merchantid = kltPayConfig.getMerchantId();
//			key = kltPayConfig.getMd5Key();
//			signType = SignType.MD5;
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			signType = SignType.RSA;
//			try {
//				key = AesCbcUtil.decrypt(account.getMerchantPrivateKey());
//			} catch (Exception e) {
//				log.error("解析企业商户号的私钥失败", e);
//			}
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType(signType);
//
//		QueryContent content = new QueryContent().setMchtOrderNo(trade.getTradeno())
//				.setOrderDate(DateUtil.getStringDate(trade.getTradetime(), DateUtil.FORMAT_STYLE_5))
//				.setPaymentBusinessType(QueryContent.SINGLE_PAY);
//
//		return queryInternal(key, head, content);
//	}
//
//	/**
//	 * 单笔提现 查询结果
//	 *
//	 * @param formBean
//	 */
//	public SmartResult querySingleWithdraw(BaseSimpleFormBean<Integer> formBean) {
//
//		Integer wdid = formBean.getReqdata();
//		PartnerWithdraw withdraw = new PartnerWithdraw().selectById(wdid);
//
//		String merchantid = withdraw.getMerchantid();
//		String key = "";
//		String signType = "";
//		if (StringUtils.isEmpty(merchantid)) {
//			//使用九歌账户支付
//			merchantid = kltPayConfig.getMerchantId();
//			key = kltPayConfig.getMd5Key();
//            signType = SignType.MD5;
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			signType = SignType.RSA;
//			try {
//				key = AesCbcUtil.decrypt(account.getMerchantPrivateKey());
//			} catch (Exception e) {
//				log.error("解析企业商户号的私钥失败", e);
//			}
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType(signType);
//
//		QueryContent content = new QueryContent().setMchtOrderNo(withdraw.getWdno())
//				.setOrderDate(DateUtil.getStringDate(withdraw.getCreatetime(), DateUtil.FORMAT_STYLE_5))
//				.setPaymentBusinessType(QueryContent.SINGLE_PAY);
//
//		return queryInternal(key, head, content);
//	}
//
//	private SmartResult queryInternal(String key, Head head, QueryContent content) {
//		QueryRequest request = new QueryRequest();
//		request.setHead(head);
//		request.setContent(content);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		//添加签名
//		String respJsonStr = null;
//
//		try {
//			String signStr;
//			if (head.getSignType().equals(SignType.MD5)) {
//				signStr = SignUtils.addSign(originSign, key);
//			} else {
//				signStr = RSAUtils.sortAndRsa256Sign(originSign, key);
//			}
//			//忽略SSL认证
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getQueryUrl(), signStr, false);
//		} catch (Exception e) {
//			log.error("查询交易报错", e);
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("查询单笔代付返回:" + respJsonStr);
//		QueryResult result = JSON.parseObject(respJsonStr, QueryResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			return SmartResult.fail(StatusMsg.StatusMsg_445);
//		}
//		QueryResultDto resultDto = new QueryResultDto();
//		BeanUtils.copyProperties(result, resultDto);
//
//		return SmartResult.success(resultDto);
//	}
//
//}
